<?php


/**
* Модуль работы с заявками.
*
* @author Владислав В. Костянецкий <bytecoded@gmail.com>
* @link   http://drfreddy.ru/akinoyume/
*/


// Определяем запрошенное действие.

$do = filter_input( INPUT_POST, 'do', FILTER_SANITIZE_STRING );

$request_code = isset( $key[1] ) ? $key[1] : '';

$request = app::$db->get( "SELECT r.* FROM `requests` r WHERE r.`code` = UPPER( ? ) LIMIT 1", array( $request_code ) );

$topic = app::$db->get( "SELECT t.* FROM `topics` t WHERE t.id = ? LIMIT 1", array( $request['topic_id'] ) );

if ( $do != 'create' and $do != 'view' and $request_code and (!$request or !$topic)) 
{
  app::$db->execute( 
    "INSERT INTO `faults` ( `code`, `ip` ) VALUES ( :code, :ip )",
    array( 'code' => $request_code, 'ip' => $_SERVER['REMOTE_ADDR'] ) 
  );
  
  require_once MDLS . 'errors/404.php';
}

switch ( $do )
{
  case 'view':
  
  $code = filter_input( INPUT_POST, 'code', FILTER_SANITIZE_STRING );
  
  redirect( URL . 'requests/' . $code );
  
  break;

  // СОЗДАТЬ ЗАЯВКУ

  case 'create':
  
    $topic_code = filter_input( INPUT_POST, 'topic', FILTER_SANITIZE_STRING );
     
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_CLOSE) and !org::$id ) slowpoke();
     
    $topic_id = app::$db->get(
      "SELECT `id` FROM `topics` WHERE `code` = ? LIMIT 1", 
      array( $topic_code ),
      'id'
    );
      
    if ( $topic_id )
    {
      $request_code = requests::make_code();
      
      app::$db->execute( 
        "INSERT INTO `requests` ( `code`, `topic_id`, `create_time`, `update_time` ) VALUES ( :code, :topic_id, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() )",
        array( 'code' => $request_code, 'topic_id' => $topic_id ) 
      );
      
      $request_id = app::$db->last_insert_id();
      
      app::$db->execute(
        "INSERT INTO `members` ( `request_id`, `create_time`, `leader` ) VALUES ( :request_id, UNIX_TIMESTAMP(), 1 )",
        array( 'request_id' => $request_id )
      );
      
      org::log( $request_id, 'создал заявку' );          
      
      redirect( URL . 'requests/' . $request_code );      
    }
    else $message = 'Не удалось создать заявку. Попробуйте еще раз!';
      
  break;

  // ИЗМЕНЕНИЕ СТАТУСА
  
  case 'set-status':
  
    $status   = filter_input( INPUT_POST, 'status', FILTER_SANITIZE_STRING );
    $statuses = array( 'pending', 'waiting', 'approved', 'disapproved' );

    if ( org::$id and $status and in_array( $status, $statuses ) )
    {
      requests::set_status( $request['id'], $status );
        
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус заявки' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;

  // ИЗМЕНЕНИЕ ГОЛОСОВАНИЯ
  
  case 'set-voting':
  
    $voting_number = filter_input( INPUT_POST, 'voting_number', FILTER_VALIDATE_INT );
    $voting_title  = filter_input( INPUT_POST, 'voting_title' , FILTER_SANITIZE_STRING );
    
    if ( org::$id )
    {
      app::$db->execute(
        "UPDATE `requests` SET `voting_title` = :voting_title, `voting_number` = :voting_number WHERE `id` = :request_id",
        array( 
          'request_id'    => $request['id'],
          'voting_title'  => $voting_title,
          'voting_number' => $voting_number,          
        ) 
      );      

      org::log( $request['id'], 'изменил параметры голосования заявки' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;
  
  // ИЗМЕНЕНИЕ СТАТУСА
  
  case 'leader-approved':
  
    if ( org::$id )
    {         
      app::$db->execute( "UPDATE `members` SET `status` = 'approved' WHERE `request_id` = ? AND `leader` = 1", array( $request['id'] ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус лидера' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;  

  case 'leader-disapproved':
  
    if ( org::$id )
    {         
      app::$db->execute( "UPDATE `members` SET `status` = 'disapproved' WHERE `request_id` = ? AND `leader` = 1", array( $request['id'] ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус лидера' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;  
  
  case 'member-approved':
    
    $member_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
  
    if ( org::$id and $member_id )
    {         
      app::$db->execute( "UPDATE `members` SET `status` = 'approved' WHERE `request_id` = :request_id AND `id` = :member_id", array( 'request_id' => $request['id'], 'member_id' => $member_id ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус участника' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;  

  case 'member-disapproved':
    
    $member_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
  
    if ( org::$id and $member_id )
    {         
      app::$db->execute( "UPDATE `members` SET `status` = 'disapproved' WHERE `request_id` = :request_id AND `id` = :member_id", array( 'request_id' => $request['id'], 'member_id' => $member_id ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус участника' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;  

  case 'file-approved':
    
    $file_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
  
    if ( org::$id and $file_id )
    {         
      app::$db->execute( "UPDATE `files` SET `status` = 'approved' WHERE `request_id` = :request_id AND `id` = :file_id", array( 'request_id' => $request['id'], 'file_id' => $file_id ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус файла' );          
       
      redirect( URL . 'requests/' . $request_code );
    }
  
  break;  
  
  case 'file-disapproved':
    
    $file_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
  
    if ( org::$id and $file_id )
    {
      app::$db->execute( "UPDATE `files` SET `status` = 'disapproved' WHERE `request_id` = :request_id AND `id` = :file_id", array( 'request_id' => $request['id'], 'file_id' => $file_id ) );      
            
      requests::mark_updated( $request['id'] );
          
      org::log( $request['id'], 'изменил статус файла' );          
       
      redirect( URL . 'requests/' . $request_code );      
    }
  
  break;  
  
  // ОТПРАВИТЬ ЗАЯВКУ
  
  case 'submit':

    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_CLOSE) and !org::$id ) slowpoke();
  
    $leader_name = app::$db->get(
      'SELECT `name` FROM `members` WHERE `request_id` = ? AND `leader` = 1 LIMIT 1',
      array( $request['id'] ),
      'name'
    );
      
    if ( $leader_name )
    {
      if ( filter_input( INPUT_POST, 'agreement', FILTER_VALIDATE_INT ) )
      {
        requests::set_status( $request['id'], 'pending' );
      
        requests::mark_updated( $request['id'] );
         
        org::log( $request['id'], 'отправил заявку' );          
          
        redirect( URL . 'requests/' . $request_code );
      }
      else $message = 'Прежде чем отправить заявку, нужно подтвердить, что вы ознакомились с пользовательским соглашением. Сделайте это, пожалуйста! Ссылка на соглашение находится над кнопкой отправки заявки.';
    }
    else $message = 'Нельзя отправить заявку, даже не представившись. Сделайте это, пожалуйста!';
  
  break;  
  
  // ОБНОВИТЬ ВЫСТУПЛЕНИЕ
  
  case 'update-info':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $info = array();
  
    if ( $topic['details_enabled'] ) 
    {
      $info['title']  = trim( filter_input( INPUT_POST, 'title', FILTER_SANITIZE_STRING ) );
      $info['team']   = trim( filter_input( INPUT_POST, 'team', FILTER_SANITIZE_STRING ) );
    }
     
    if ( count( $info ) )
    {      
      $data = database::build_update( $info );  

      $info['request_id'] = $request['id'];     
       
      app::$db->execute( "UPDATE `requests` SET $data WHERE `id` = :request_id", $info );      

      org::log( $request['id'], 'обновил информацию о выступлении' );          
      
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );

      requests::mark_updated( $request['id'] );            
          
      redirect( URL . 'requests/' . $request['code'] );    
    }
  
  break;

  // ОБНОВИТЬ ПРОДОЛЖИТЕЛЬНОСТЬ
  
  case 'update-duration':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $info = array();
  
    if ( $topic['duration_enabled'] ) 
    {
      $info['duration'] = trim( filter_input( INPUT_POST, 'duration', FILTER_VALIDATE_INT ) );      
    }
     
    if ( count( $info ) )
    {      
      $data = database::build_update( $info );  

      $info['request_id'] = $request['id'];     
       
      app::$db->execute( "UPDATE `requests` SET $data WHERE `id` = :request_id", $info );      

      org::log( $request['id'], 'обновил информацию о выступлении' );          
      
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );

      requests::mark_updated( $request['id'] );            
          
      redirect( URL . 'requests/' . $request['code'] );    
    }
  
  break;

  // ОБНОВИТЬ ОПИСАНИЕ

  case 'update-about':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $info = array();
  
    if ( $topic['about_enabled'] ) 
    {
      $info['about'] = trim( filter_input( INPUT_POST, 'about', FILTER_SANITIZE_STRING ) );      
    }
     
    if ( count( $info ) )
    {      
      $data = database::build_update( $info );  

      $info['request_id'] = $request['id'];     
       
      app::$db->execute( "UPDATE `requests` SET $data WHERE `id` = :request_id", $info );      

      org::log( $request['id'], 'обновил информацию о выступлении' );          
      
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );

      requests::mark_updated( $request['id'] );            
          
      redirect( URL . 'requests/' . $request['code'] );    
    }
  
  break;

  
  // ОБНОВИТЬ ЛИДЕРА
  
  case 'update-leader':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $leader = array(
      'nickname'  => trim( filter_input( INPUT_POST, 'nickname',   FILTER_SANITIZE_STRING ) ),
      'name'		  => trim( filter_input( INPUT_POST, 'name',       FILTER_SANITIZE_STRING ) ),
      'city'	  	=> trim( filter_input( INPUT_POST, 'city',       FILTER_SANITIZE_STRING ) ),
      'phone'		  => trim( filter_input( INPUT_POST, 'phone',      FILTER_SANITIZE_STRING ) ),
      'email'   	=> trim( filter_input( INPUT_POST, 'email',      FILTER_SANITIZE_STRING ) ),
    );
    
    if ( $topic['characters_enabled'] )
    {
      $leader['character'] = trim( filter_input( INPUT_POST, 'character',  FILTER_SANITIZE_STRING ) );
      $leader['fandom']    = trim( filter_input( INPUT_POST, 'fandom',     FILTER_SANITIZE_STRING ) );
    }
    
    $passed = true;
    
    foreach ( $leader as $field )
    {
      if ( $field != '' ) continue;
      
      $passed = false;
      break;
    }
        
    if ( $passed )
    {
      $data = database::build_update( $leader );  

      $leader['request_id'] = $request['id'];     
       
      app::$db->execute( "UPDATE `members` SET $data WHERE `request_id` = :request_id AND `leader` = 1", $leader );      
      
      org::log( $request['id'], 'обновил информацию автора заявки' );
      
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
          
      requests::mark_updated( $request['id'] );            
          
      redirect( URL . 'requests/' . $request['code'] );
    }
    else $message = 'Вы не заполнили всю информацию о себе. Сделайте это, пожалуйста!';
  
  break;    
    
  // СОЗДАТЬ УЧАСТНИКА

  case 'create-member':

    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $member = array(
      'nickname'  => trim( filter_input( INPUT_POST, 'nickname',   FILTER_SANITIZE_STRING ) ),
      'name'		  => trim( filter_input( INPUT_POST, 'name',       FILTER_SANITIZE_STRING ) ),
      'city'	  	=> trim( filter_input( INPUT_POST, 'city',       FILTER_SANITIZE_STRING ) ),
    );
  
    if ( $topic['characters_enabled'] )
    {  
      $member['character'] = trim( filter_input( INPUT_POST, 'character',  FILTER_SANITIZE_STRING ) );
      $member['fandom']    = trim( filter_input( INPUT_POST, 'fandom',     FILTER_SANITIZE_STRING ) );    
    }

    $passed = true;
    
    foreach ( $member as $field )
    {
      if ( $field != '' ) continue;
      
      $passed = false;
      break;
    }
  
    if ( $passed )
    {    
      $member['request_id'] = $request['id'];
    
      list( $fields, $values ) = database::build_insert( $member );
      
      app::$db->execute( "INSERT INTO `members` ( $fields ) VALUES ( $values )", $member );    

      org::log( $request['id'], 'добавил участника' );
      
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
          
      requests::mark_updated( $request['id'] );            
        
      redirect( URL . 'requests/' . $request['code'] );  
    }
    else $message = 'Вы заполнили не всю информацию об участнике. Сделайте это, пожалуйста!';
  
  break;

  case 'notify':
    
    if ( org::$id )
    {
  
      $text  = iconv( 'UTF-8', 'WINDOWS-1251', filter_input( INPUT_POST, 'message', FILTER_SANITIZE_STRING ) );
      $by    = filter_input( INPUT_POST, 'by', FILTER_SANITIZE_STRING );
      
      if ( $by == 'sms' )
      {
        $phone = app::$db->get( "SELECT `phone` FROM `members` WHERE `request_id` = ? AND `leader` = 1 LIMIT 1", array( $request['id'] ), 'phone' );      
        $phone   = str_replace( array(' ','+','-'), '', $phone );
     
        if ( intval( $phone ) )
        {
          $result = file_get_contents( "http://gatesms.ru/sender.php?lg=ku2009&pw=8675309&fl=S&to=" . urlencode( $phone ) . "&mg=" . urlencode( $text ) );
            
          if ( preg_match( "/^OK: (\d+)/", $result, $m ) )
          {
            org::log( $request['id'], "отправил СМС-уведомление (ID {$m[1]})" );           
            
            redirect( URL . 'requests/' . $request_code );
          }  
          else if ( preg_match( "/^ERROR: (\d+)/", $result, $m ) )
          {
            $ERRORS = array(
              0 => 'ошибка в параметрах',
              1 => 'неверный логин / пароль', 
              2 => 'ошибка в флаге назначения', 
              3 => 'ошибка в адресе назначения', 
              4 => 'баланс ниже необходимого уровня',
              5 => 'запрос отклонён оператором'
            );
              
            $message = 'Сообщение не отправлено. СМС-шлюз сообщает: ' . $ERRORS[ $m[1] ];            
          }      
        }
      }
      else if ( $by == 'email' )
      {      

      }
    }
      
  break;
  
  // УДАЛИТЬ УЧАСТНИКА

  case 'delete-member':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    if ( $id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT ) )
    {
      app::$db->execute(
        "DELETE FROM `members` WHERE `id` = :id AND `request_id` = :request_id AND `leader` = 0",
        array( 'id' => $id, 'request_id' => $request['id'] )
      );    
    
      org::log( $request['id'], 'удалил участника' );
    
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
          
      requests::mark_updated( $request['id'] );            
        
      redirect( URL . 'requests/' . $request['code'] );    
    }
    else $message = 'Не найден участник, которого нужно удалить. Попробуйте ещё раз!';
        
  break;
  
  // ЗАГРУЗКА ИЗОБРАЖЕНИЙ НА СЕРВЕР

  case 'create-logo-upload':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();      

    if ( $file_name  = filter_var($_FILES['logo_upload']['name'], FILTER_SANITIZE_STRING ) )
    {
      if ( $_FILES['logo_upload']['size'] <= MAX_UPLOAD_IMG_SIZE*1024*1024 )
      {
        $file_ext = strtolower(strrchr($file_name, '.'));

        if ( in_array($file_ext, $IMG_WHITE_LIST) )
        {
          $upload_dir = PATH . 'requests_files/' . $request['id'];

          if(!is_dir($upload_dir)) mkdir($upload_dir);

          $uploadfile = PATH . 'requests_files/' . $request['id'] . '/' . basename($file_name);
          $thumbfile  = PATH . 'requests_files/' . $request['id'] . '/thumb_' . basename($file_name);
          $link       =        'requests_files/' . $request['id'] . '/' . basename($file_name);
          $thumblink  =        'requests_files/' . $request['id'] . '/thumb_' . basename($file_name);

          // Принудительный ресайз - вычисление пропорций
          list($width_orig, $height_orig) = getimagesize($_FILES['logo_upload']['tmp_name']);

          if ($width_orig and $height_orig and $image = imagecreatefromjpeg($_FILES['logo_upload']['tmp_name']))
          {
            // изменение размеров большого файла
            $ratio_orig = $width_orig / $height_orig;          
            $width  = $width_orig;
            $height = $height_orig;
            if ($width > RESIZE_MAX_WIDTH)
            {
              $width  = RESIZE_MAX_WIDTH;
              $height = floor( $width / $ratio_orig );
            }
            if ($height > RESIZE_MAX_HEIGHT)
            {
              $height = RESIZE_MAX_HEIGHT;
              $width  = floor( $height * $ratio_orig );
            }
            
            // изменение размеров превьюшки
            $thumbwidth  = $width_orig;
            $thumbheight = $height_orig;
            if ($thumbwidth > THUMB_MAX_WIDTH)
            {
              $thumbwidth  = THUMB_MAX_WIDTH;
              $thumbheight = floor( $thumbwidth / $ratio_orig );
            }
            if ($height > THUMB_MAX_HEIGHT)
            {
              $thumbheight = THUMB_MAX_HEIGHT;
              $thumbwidth  = floor( $thumbheight * $ratio_orig );
            }

            // ресэмплирование
            $image_p = imagecreatetruecolor($width, $height);
            imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
            imagejpeg($image_p, $uploadfile);
            imagedestroy($image_p);

            $image_t = imagecreatetruecolor($thumbwidth, $thumbheight);
            imagecopyresampled($image_t, $image, 0, 0, 0, 0, $thumbwidth, $thumbheight, $width_orig, $height_orig);
            imagejpeg($image_t, $thumbfile);
            imagedestroy($image_t);

            imagedestroy($image);

            unlink($_FILES['logo_upload']['tmp_name']);                     

            app::$db->execute( "
                INSERT INTO `files`
                ( `request_id`, `create_time`, `type`, `path`, `title` )
                VALUES
                ( :request_id, UNIX_TIMESTAMP(), :type, :path, :title )",
                
                array(
                  'request_id'  => $request['id'],
                  'type'        => 'image',
                  'path'        => $link,
                  'title'       => $thumblink,
                )
              );      
            
            org::log( $request['id'], 'загрузил файл' );          
            
            if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
                       
            requests::mark_updated( $request['id'] );            
               
            redirect( URL . 'requests/' . $request['code'] );               
          }
          else $message = 'Ошибка при обработке изображения.';
        }
        else $message = 'Ваш файл какой-то подозрительный, сервер отказался его у себя хранить!';
      }
      else $message = 'Ваш файл превышает допустимый размер. Загрузите его на сторонний сервис и укажите ссылку на него.';
    }
    else $message = 'Вы не указали файл. Сделайте это, пожалуйста!';
             
  break;  

  // ЗАГРУЗИТЬ ФАЙЛ НА СЕРВЕР

  case 'create-file-upload':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();      

    if ( $file_name  = filter_var($_FILES['file_upload']['name'], FILTER_SANITIZE_STRING ) )
    {
      if ( $_FILES['file_upload']['size'] <= MAX_UPLOAD_FILE_SIZE*1024*1024 )
      {
        $file_ext = strtolower(strrchr($file_name, '.'));

        if ( in_array($file_ext, $FILES_WHITE_LIST) )
        {
          $upload_dir = PATH . 'requests_files/' . $request['id'];

          if(!is_dir($upload_dir)) mkdir($upload_dir);

          $uploadfile = PATH . 'requests_files/' . $request['id'] . '/' . basename($file_name);
          $link       =        'requests_files/' . $request['id'] . '/' . basename($file_name);

          if (move_uploaded_file($_FILES['file_upload']['tmp_name'], $uploadfile)) {
           
          app::$db->execute( "
              INSERT INTO `files`
              ( `request_id`, `create_time`, `type`, `path`, `title` )
              VALUES
              ( :request_id, UNIX_TIMESTAMP(), :type, :path, :title )",
              
              array(      
                'request_id'  => $request['id'],
                'type'        => 'file',
                'path'        => $link,
                'title'       => basename($file_name),
              )
            );      
          
            org::log( $request['id'], 'загрузил файл' );          
          
            if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
                     
            requests::mark_updated( $request['id'] );            
             
            redirect( URL . 'requests/' . $request['code'] );    

          }
          else $message = 'Ошибка при перемещении загруженного файла.';
        }
        else $message = 'Ваш файл какой-то подозрительный, сервер отказался его у себя хранить!';
      }
      else $message = 'Ваш файл превышает допустимый размер. Загрузите его на сторонний сервис и укажите ссылку на него.';
    }
    else $message = 'Вы не указали файл. Сделайте это, пожалуйста!';
             
  break;  

  // СОЗДАТЬ ССЫЛКУ НА ФАЙЛ
  
  case 'create-file-link':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    $link   = filter_input( INPUT_POST, 'file_link', FILTER_SANITIZE_STRING );
    $title  = filter_input( INPUT_POST, 'file_link', FILTER_SANITIZE_STRING );
    
    if ( ! $title ) $title = $link;
  
    if ( $link )
    {
      app::$db->execute( "
        INSERT INTO `files`
        ( `request_id`, `create_time`, `type`, `path`, `title` )
        VALUES
        ( :request_id, UNIX_TIMESTAMP(), :type, :path, :title )",
        
        array(      
          'request_id'  => $request['id'],
          'type'        => 'link',
          'path'        => $link,        
          'title'       => $title,
        )
      );      
    
      org::log( $request['id'], 'добавил ссылку на файл' );          
    
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
               
      requests::mark_updated( $request['id'] );            
       
      redirect( URL . 'requests/' . $request['code'] );    
    }
    else $message = 'Вы не ввели ссылку на файл. Сделайте это, пожалуйста!';
    
  break;  
  
  // УДАЛИТЬ ФАЙЛ
  
  case 'delete-file':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    if ( $id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT ) )
    {

      // Получить тип файла, и удалить его если он на сервере

      $file = app::$db->get(
        "SELECT f.* FROM `files` f WHERE `id` = :id AND `request_id` = :request_id",
        array( 'id' => $id, 'request_id' => $request['id'] ) 
      );

      if ( $file['type'] != 'link')
      {
        unlink( PATH . $file['path'] );
      }

      // Внести изменения в базу

      app::$db->execute(
        "DELETE FROM `files` WHERE `id` = :id AND `request_id` = :request_id",
        array( 'id' => $id, 'request_id' => $request['id'] )
      );
    
      org::log( $request['id'], 'удалил файл' );          
    
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
          
      requests::mark_updated( $request['id'] );        
          
      redirect( URL . 'requests/' . $request['code'] );      
    }
    else $message = 'Не найдена ссылка, которую нужно удалить. Попробуйте ещё раз!';
  
  break;  
    
  // СОЗДАТЬ КОММЕНТАРИЙ
    
  case 'create-comment':
  
    $content = filter_input( INPUT_POST, 'content', FILTER_SANITIZE_STRING );
  
    if ( $content )
    {
      app::$db->execute( "
        INSERT INTO `comments`
        ( `request_id`, `create_time`, `content`, `org_id` )
        VALUES
        ( :request_id, UNIX_TIMESTAMP(), :content, :org_id )",
        
        array( 'request_id' => $request['id'], 'content' => $content, 'org_id' => org::$id ) 
      );      
    
      org::log( $request['id'], 'оставил комментарий' );          
    
      requests::mark_commented( $request['id'] );              
        
      redirect( URL . 'requests/' . $request['code'] );
    }
    else $message = 'Вы не ввели текст комментария. Сделайте это, пожалуйста!';
        
  break;

  // СОЗДАТЬ ССЫЛКУ

  case 'create-link':
  
    $link_href  = filter_input( INPUT_POST, 'link_href', FILTER_SANITIZE_STRING );
    $link_title = filter_input( INPUT_POST, 'link_title', FILTER_SANITIZE_STRING );
  
    if ( $link_href and $link_title )
    {

      $link_icon = 'link.png';

      foreach ($LINKS_ICONS as $k => $v)
      {
        if ( strpos($link_href, $k) !== false)
        {
          $link_icon = $v;
          break;
        }
      }

      app::$db->execute( "
        INSERT INTO `links`
        ( `request_id`, `create_time`, `title`, `href` , `icon`)
        VALUES
        ( :request_id, UNIX_TIMESTAMP(), :title, :href, :icon )",
        
        array( 'request_id' => $request['id'], 'title' => $link_title, 'href' => $link_href, 'icon' => $link_icon) 
      );      
    
      org::log( $request['id'], 'добавил ссылку' );          
        
      requests::mark_updated( $request['id'] );        
          
      redirect( URL . 'requests/' . $request['code'] );      
    }
    else $message = 'Вы не ввели адрес ссылки или её описание. Сделайте это, пожалуйста!';
        
  break;

  // УДАЛИТЬ ССЫЛКУ

  case 'delete-link':
  
    if ( (FESTIVAL_STATE<FS_REQ_OPEN or FESTIVAL_STATE>=FS_REQ_LOCK) and !org::$id ) slowpoke();
  
    if ( $id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT ) )
    {
      app::$db->execute(
        "DELETE FROM `links` WHERE `id` = :id AND `request_id` = :request_id",
        array( 'id' => $id, 'request_id' => $request['id'] )
      );    
    
      org::log( $request['id'], 'удалил ссылку' );
    
      if ( $request['status'] != 'new' ) requests::set_status( $request['id'], 'pending' );
          
      requests::mark_updated( $request['id'] );            
        
      redirect( URL . 'requests/' . $request['code'] );    
    }
    else $message = 'Не найдена ссылка, которую нужно удалить. Попробуйте ещё раз!';
        
  break;
}

// Если код заявки не задан, отображаем общую страницу.

if ( ! $request_code ) require_once MDLS . 'page.php';

// Выводим страницу заявки.

$leader = app::$db->get( 
  "SELECT * FROM `members` WHERE `request_id` = ? AND `leader` = 1 LIMIT 1", 
  array( $request['id'] ) 
);

$members  = app::$db->grab(  
  "SELECT * FROM `members` WHERE `request_id` = ? AND `leader` <> 1 ORDER BY `name` ASC",
  array( $request['id'] )
);

$links  = app::$db->grab(  
  "SELECT * FROM `links` WHERE `request_id` = ?",
  array( $request['id'] )
);

$files = app::$db->grab(  
  "SELECT * FROM `files` WHERE `request_id` = ?",
  array( $request['id'] )
);

// Находим файлы изображений
$images = Array();
foreach ( $files as $file )
{
  if ($file['type']==='image')
  {
    $images[] =  $file;    
  }
}

$comments = app::$db->grab( 

 "SELECT
    c.`id`, c.`org_id`, c.`content`,
    o.`name` AS 'org_name'      
  FROM 
    `comments` c
  LEFT JOIN 
    `orgs` o ON o.`id` = c.`org_id`
  WHERE 
    c.`request_id` = ?
  ORDER BY 
    c.`create_time` ASC",
      
  array( $request['id'] )
  
);    
           
// Формируем заголовок страницы.

$page_title  = "{$topic['title']}, ";      
$page_title .= $request['status'] == 'new' ? 'новая заявка' : "заявка {$request['code']}";
  
$titles[] = $page_title;
 
// Подключаем шаблон.
   
require_once HTML . 'autumn/header.php';
require_once HTML . 'autumn/cases/request/page.php';
require_once HTML . 'autumn/footer.php';  

exit;

function slowpoke()
{
  $page_title  = "Не получается!";      
  $titles[] = $page_title;
               
  require_once HTML . 'autumn/header.php';
  require_once HTML . 'autumn/cases/request/closed.php';
  require_once HTML . 'autumn/footer.php';  

  exit;
}